import UIKit
/**
    B站：https://www.bilibili.com/video/BV144411C7Gg?p=40

    第40课
        1. 必要初始化器 required
        2. 结构体成员初始化器
        3. 闭包设置属性初始化值
 */

// 1. 必要初始化器 required
class Person {
    var name:String
    // 必要初始化器 required
    required init(name: String) {
        self.name = name
    }
}

class Student: Person {
    required init(name: String) {
        super.init(name: name)
    }
}

let stu = Student(name: "小李")
print(stu.name)


// -----------------------------------------------------------
// 2. 【结构体】成员初始化器
struct Animal {
    var name: String // 可以不给默认值 ----
    var age: Int // 可以不给默认值 ----
    // 下面的不写，也会默认的 （仅【结构体】有这个默认， class 没有）
//    init(name: String, age: Int) {
//        self.name = name
//        self.age = age
//    }
}

//let an = Animal(name: <#T##String#>, age: <#T##Int#>) // 看这里 ----


class Dog {
    var name: String = ""  // 必须给默认值 ----
    
    var age: Int  // 如果下面有 初始化器有初始化 给该变量，可以不写默认值 ---
    init(age: Int) {
        self.age = age
    }
}
// let d = Dog()  // 看这里 ----
// let d = Dog(age: <#T##Int#>)  // 看这里 ----




// -----------------------------------------------------------
// 3. 闭包设置属性初始化值

class Paper {
    // 闭包
    var name: String = {return "hello Swift"}()
    
    var age: Int = {
        // 只是用于初始值的功能，不是get/set功能
        // 值处理 复杂的时候会用到，让代码开启是一个功能，书写/查看 方便
        let a = 10
        let b = 20
        return a + b
        // 闭包里面 用不了self
    }()
}

let p = Paper()
print(p.name)
print(p.age)
